{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 16\n",
    "\n",
    "# 不同SVD类型\n",
    "Book_4《矩阵力量》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5377751b-acd8-4db6-b102-0d8af60056b1",
   "metadata": {},
   "source": [
    "该代码实现了对矩阵的奇异值分解（SVD）及其在重构和误差分析中的应用，主要分为以下几个步骤：\n",
    "\n",
    "1. **导入必要的库**：代码使用了 `NumPy` 进行数值计算，`Matplotlib` 和 `Seaborn` 进行可视化展示。设置的精度为小数点后三位。\n",
    "\n",
    "2. **SVD分解**：通过函数`svd(X, full_matrices)`对输入矩阵$X$进行奇异值分解，计算得到三个矩阵：\n",
    "   - $U$: 左奇异矩阵，其中每一列代表一个特征向量；\n",
    "   - $S$: 奇异值矩阵，是一个对角矩阵，其对角线上的元素$s_i$为非负值，按降序排列；\n",
    "   - $V^T$: 右奇异矩阵的转置。  \n",
    "   公式为：$$X = U S V^T$$。根据`full_matrices`的设置，决定是否返回完整矩阵。\n",
    "\n",
    "3. **生成随机矩阵**：生成一个6行4列的随机矩阵$X$，并调整其秩，以便后续的SVD分析。具体操作是将第4列设置为第1列和第2列之和。\n",
    "\n",
    "4. **可视化分解结果**：通过热力图展示原始矩阵$X$、左奇异矩阵$U$、奇异值矩阵$S$以及右奇异矩阵$V^T$。这部分帮助理解SVD分解后矩阵的结构及数值分布。\n",
    "\n",
    "5. **紧致形式SVD分解**：使用紧致形式进行SVD分解，减少内存使用并提升计算效率，继续可视化分解结果。\n",
    "\n",
    "6. **压缩形式分析**：将原矩阵调整为秩为3的矩阵，并再次进行SVD分解与可视化，展示不同秩对矩阵结构的影响。\n",
    "\n",
    "7. **截断重构与误差分析**：截断奇异值分解，保留前2个奇异值进行重构，得到近似矩阵$\\hat{X}$。使用公式：$$\\hat{X} = U_{truc} S_{truc} V_{truc}^T$$，并可视化重构后的矩阵与原始矩阵之间的误差$E = X - \\hat{X}$，通过热力图展示重构效果与残差。\n",
    "\n",
    "8. **奇异值的张量积**：计算各个奇异值对应的外积，得到矩阵的各个组成部分，如$$u_1 v_1^T$$，并进行可视化。这些组成部分展示了如何通过奇异值及其对应的特征向量重构原始矩阵。\n",
    "\n",
    "9. **整体分析**：将所有重构分量的和进行可视化，分析各个部分对原始矩阵的贡献，并计算其重构误差，进一步理解奇异值分解的有效性。\n",
    "\n",
    "通过这些步骤，该代码为分析和理解矩阵的奇异值分解提供了直观的可视化工具，帮助研究人员和工程师有效地处理和重构数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ad32022-0020-488a-8ccf-b01ccbb72718",
   "metadata": {},
   "source": [
    "## 导入必要的库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6b033925-a847-4524-9055-cf942427b737",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np  # 导入NumPy库，用于数值计算\n",
    "from matplotlib import pyplot as plt  # 导入Matplotlib库用于绘图\n",
    "import seaborn as sns  # 导入Seaborn库，用于增强图形展示效果\n",
    "PRECISION = 3  # 设置显示精度为小数点后三位"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e94738be-4b5f-4cfe-b0ee-4ab656a8f70d",
   "metadata": {},
   "source": [
    "## 定义SVD分解函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "24f0c2af-7dd0-4f04-846a-1715559bbf72",
   "metadata": {},
   "outputs": [],
   "source": [
    "def svd(X, full_matrices):  # 定义函数svd，用于计算SVD分解\n",
    "    \"\"\"\n",
    "    执行矩阵X的奇异值分解（SVD）。\n",
    "    参数：\n",
    "    - X: 输入矩阵\n",
    "    - full_matrices: 布尔值，指定是否使用完整矩阵\n",
    "    返回：\n",
    "    - U: 舍入后的U矩阵\n",
    "    - S: 舍入后的奇异值矩阵\n",
    "    - Vt: 转置的V矩阵\n",
    "    \"\"\"\n",
    "    U, s, Vt = np.linalg.svd(X, full_matrices=full_matrices)  # 计算X的SVD分解\n",
    "\n",
    "    if full_matrices:  # 判断是否使用完整矩阵\n",
    "        S = np.zeros(X.shape)  # 创建与X形状相同的零矩阵\n",
    "        np.fill_diagonal(S, s)  # 将奇异值填入S的对角线\n",
    "    else:\n",
    "        S = np.diag(s)  # 如果不是完整矩阵，直接生成对角矩阵S\n",
    "\n",
    "    return np.round(U, PRECISION), np.round(S, PRECISION), np.round(Vt.T, PRECISION)  # 返回舍入后的U、S和转置的V矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab7c1caf-b687-4fc3-ad18-1d4ba7b59401",
   "metadata": {},
   "source": [
    "## 生成随机矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8fce9c82-4956-446d-8ce5-21a8054c2c39",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(1)  # 设置随机数种子，确保结果可重复\n",
    "X = np.random.randn(6, 4)  # 生成6行4列的随机矩阵X"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4268c277-c8e1-405d-9aab-ce7a5e08f56a",
   "metadata": {},
   "source": [
    "## 设置可视化参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "93c1a8e3-b4db-4d5c-abbf-266ec5ecfe22",
   "metadata": {},
   "outputs": [],
   "source": [
    "all_max = 2  # 热力图显示的最大值\n",
    "all_min = -2  # 热力图显示的最小值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f19280ae-18d6-45d7-8210-94461f7512f6",
   "metadata": {},
   "source": [
    "## 完整SVD分解并可视化结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aafc2c43-219f-4e55-a891-c9050352306c",
   "metadata": {},
   "outputs": [],
   "source": [
    "U, S, V = svd(X, full_matrices=True)  # 对X进行完整SVD分解，得到U, S, V矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0900739c-c50a-4efd-9392-50369b53f959",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$V^T$')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8QAAAETCAYAAADwCM9JAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAudklEQVR4nO3de3RU9b338c+eSTLhFihEMQgIShXkpgbtExBQsFBqvVeEo5ZKbQ1FW04eULmsgq0YrecUFVBRWx7wLMT2WJEeAQ1HBC3SchWIgCJo8IJBpQExmSQz+/kjySQDuTDJzN6z936/1prFzOzJfL9b8/nt+WZuhmmapgAAAAAA8Bif3Q0AAAAAAGAHBmIAAAAAgCcxEAMAAAAAPImBGAAAAADgSQzEAAAAAABPYiAGAAAAAHgSAzEAAAAAwJMYiAEAAAAAnsRADAAAAADwJAZiAAAAAIAnMRADAAAAADyJgRgAAAAAmuGPf/yj2rZtq7Zt2yotLU2pqamRyyNGjLC7PZwGwzRN0+4mAAAAAMDJfvGLX6ht27b6wx/+YHcriAHPEAMAAABAC+3cuVMDBgywuw3EiIHYhR566CEZhqHt27efsu0nP/mJUlJS9Oqrr9rQGYBYzJgxQ4Zh6ODBg/VuP/fcczV48GCLuwLQXO+8845uvvlmZWVlKS0tTZ06ddIll1yivLw88YI9IHlMnDhRqampKi8vb/A2P/zhD9W6dWsVFRVJkkzT1O7duxmIHYiB2IXuvvtudejQQQ899FDU9b/5zW/0/PPPa/78+br66qtt6g7A6dq2bZu+853vqGfPnqdsO3r0qA4ePKjs7GwbOgMQq0WLFmnIkCEqKyvTvHnz9Prrr+uJJ57QpZdeqg0bNsgwDLtbBFBtwIABqqys1L59++rd/tprr2n16tW6//771b17d0nShx9+qGAwqL59+1rZKuIgxe4GEH8ZGRm65557NHfuXO3du1e9e/fW4sWL9bvf/U733nuvJk2aZHeLAE7Dtm3bGhx4t2zZIkkMxIADfPrpp/rVr36lcePGadmyZVHbbr31VoXDYZs6A1Cfmmd5d+/erf79+0dtq6ysVF5ennr06KF77703cv27776r888/X4FAwNJe0XI8Q+xSU6ZMUevWrZWfn6+1a9fqrrvu0tixY/Xwww/b3RqA01BUVKQjR45o0KBB9W7funWrJAZiwAnefPNNlZeXa9SoUfVu9/l4OAYkk7oD8cmefvppvffee/rP//xPpaenR67n/cPOxQrsUh07dtSkSZO0bNky3XTTTfre976npUuX8pIswCGaGni3bNmi9PR09enTx8q2ADRDu3btJEmPPfaYXn31VZWVldncEYDGZGZm6qyzzjplID569KjmzJmjkSNH6sYbb4zaxkDsXAzELjZ+/HhVVlaqbdu2euWVV3gJB+Ag27Ztk6RGnyEeOHCgUlJ45wuQ7K6++mrdeOONevfdd/WjH/1IHTp00IgRI7Ro0aJGP7QHgH0GDBigwsLCqOvmzJmjkpISPf7446fcnoHYuRiIXerYsWO64447JElffvmlvv32W5s7AhCLrVu3qmPHjurRo8cp277++mt99NFHvFwacAi/36+XXnpJhYWFeuSRR3TllVdq48aNys3N1dVXX80nTANJqH///jp48GDkMfS+ffv01FNPafLkyfV+cNaHH37Ih9Y6FAOxC1VUVOimm27SgQMHtGLFCoXDYT366KN2twUgBtu3b9fAgQPr3bZp0yZJ0mWXXWZlSwBa6MILL9S9996r1atX69ChQ+rXr5/Wrl2rvXv32t0agJMMGDBA4XBY7733niQpLy9PHTp00Jw5c+xtDHHHQOxCd955p95880395S9/0XXXXafbbrtNzz77rIqLi+1uDcBpCIVCOnz4sDp16lTv9hUrVsjv9zf4AT0Akt8ZZ5yhnJwcSeI9xUASqvvBWq+99ppWrVqlhx56SB06dLC3McQdA7HLzJo1S0uXLtXTTz+t0aNHS5JmzJih8vJyzZs3z+buAJwOv9+vzMxMbd++XRUVFVHbtm/friVLlmjcuHHKysqyqUMAp+vzzz+v9/qjR4+qoKBAXbt2PeVrXQDYr0+fPkpJSdGOHTuUl5en7OxsTZw40e62kACGyRtXXOOZZ57RXXfdpVmzZul3v/td1Lbx48dr1apV+vjjj/nLFuAAc+fO1axZszRixAjdfvvtSktL05YtW/TUU0+pR48eeuutt5SZmWl3mwCaMHLkSJWWlmrcuHHq16+fQqGQCgsLtXDhQn3xxRf6n//5Hw0bNszuNgHUo2/fvjp48KDKysr097//PfKqDrgLA7FLrFq1Stdee63Gjx+v559//pTtu3fv1oABAzRnzhz95je/saFDALH6r//6Lz3x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888jp127diWsFpzFqnXDqjVD8sa6AWez8njdHFbmtTmszHhzeGZdMNEsl112mZmbmxt1Xe/evc37778/oXUlmS+//HJCa9QoLi42JZnr16+3pN53vvMd87nnnrOkFpIb+Yq/ROfr+PHj5ne/+12zoKDAHD58uPnrX/867jVmz55tDhw4MO73C3ewY92wcs0wTfetG3A+u47XzWF1XpvD6ow3hxvXBZ4hboby8nJt3bpVo0aNirp+1KhR2rhxo01dxV9JSYkkqWPHjgmtEwqFtHz5cp04cUI5OTkJrYXkR77iy6p8TZ48WVdffbWuuuqqhNWQpA8++EBdunRRz549NW7cOB04cCCh9eAMrBvxxXEZp8MrubOSVRlvDjevCyl2N+BEX375pUKhkDp37hx1fefOnXX48GGbuoov0zSVl5enyy+/XP369UtIjV27diknJ0dlZWVq27atXn75ZV144YUJqQXnIF/xYWW+li9frm3btmnz5s0Juf8a3/ve97R06VKdf/75+uKLL/Tggw9q8ODBKiwsVKdOnRJaG8mNdSM+OC4jFl7InZWsyHhzeGFdYCBuAcMwoi6bpnnKdU519913a+fOnXr77bcTVuOCCy7Qjh079K9//UsvvfSSJkyYoPXr17suZGge8tUyVuXr0KFD+vWvf63XX39d6enpcb3vk40ZMyZyvn///srJydF5552nJUuWKC8vL6G14QysGy3DcRnN4ebcWcmKjDeHF9YFBuJmyMzMlN/vP+WvX8XFxaf8lcyJ7rnnHq1cuVIbNmxQ165dE1YnLS1NvXr1kiQNGjRImzdv1uOPP65FixYlrCaSH/mKD6vytXXrVhUXFys7OztyXSgU0oYNG7RgwQIFg0H5/f641qzRpk0b9e/fXx988EFC7h/OwboRHxyXEQu3585KVmW8ObywLvAe4mZIS0tTdna2CgoKoq4vKCjQ4MGDbeqq5UzT1N13362//vWveuONN9SzZ0/L6weDQUtrIvmQr8TVT0S+Ro4cqV27dmnHjh2R06BBg3Trrbdqx44dCRuGJSkYDGrPnj3KyspKWA04A+tG4upzXEZD3Jo7K9md8eZw47rAM8TNlJeXp9tvv12DBg1STk6OnnnmGRUVFSk3Nzfutb755hvt378/cvngwYPasWOHOnbsqO7du8etzuTJk7Vs2TK98sorateuXeQv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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 4, figsize=(12, 3))  # 创建1行4列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制X的热力图\n",
    "ax.set_aspect(\"equal\")  # 设置子图的宽高比为相等\n",
    "plt.title(r'$X$')  # 设置标题为X\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(U, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制U的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$U$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(S, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制S的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$S$')\n",
    "\n",
    "plt.sca(axs[3])  # 设置当前子图为第四个子图\n",
    "ax = sns.heatmap(V.T, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制V^T的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$V^T$')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45d49c17-61f2-4811-b7dc-624fd4daabd7",
   "metadata": {},
   "source": [
    "## 计算紧致形式（Economy-size, thin）下的SVD分解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ac7c09fe-469a-48dd-a09d-5970040c0f33",
   "metadata": {},
   "outputs": [],
   "source": [
    "U, S, V = svd(X, full_matrices=False)  # 对X进行紧致形式的SVD分解"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7be0e07-f365-4ba0-b596-6b4b75f80845",
   "metadata": {},
   "source": [
    "## 可视化紧致形式的SVD分解结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "03bb4c17-7899-42c9-8dfe-7c278eec69b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$V^T$')"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8QAAAETCAYAAADwCM9JAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqUUlEQVR4nO3de3xU9Z3/8feZSTJcE8QoxuXa8qiAXNSg+wMEFdaw1nplRWhFKrU1FPRHs4AE2YJ2MVi6IiIiassD3Qdedq3IroCGnwi6SFduIggoig1VERQaKCaTZOb8/kgyycDkNpk5Z845r+fjMY/MnO/kfD9fyDtnPpkzM4ZpmqYAAAAAAPAYn90FAAAAAABgBxpiAAAAAIAn0RADAAAAADyJhhgAAAAA4Ek0xAAAAAAAT6IhBgAAAAB4Eg0xAAAAAMCTaIgBAAAAAJ5EQwwAAAAA8CQaYgAAAACAJ9EQAwAAAAA8iYYYAAAAAOLw+9//Xh06dFCHDh2UkZGh9PT0yO2RI0faXR6awTBN07S7CAAAAABwsl/84hfq0KGDHn30UbtLQQvwDDEAAAAAtNLu3bs1cOBAu8tAC9EQu9DDDz8swzC0c+fOs8buvPNOpaWl6fXXX7ehMgAtMXv2bBmGoUOHDsUc/973vqehQ4daXBWAeL333nu67bbblJOTo4yMDJ177rm67LLLVFBQIE7YA1LHpEmTlJ6eroqKigbv88Mf/lDt2rVTSUmJJMk0Te3Zs4eG2IFoiF1o6tSp6tSpkx5++OGo7b/+9a/1/PPPa8mSJbr++uttqg5Ac+3YsUPnnHOOevXqddbYiRMndOjQIeXm5tpQGYCWWr58uYYNG6by8nItWrRIb775ph5//HFdfvnl2rx5swzDsLtEADUGDhyoqqoqHThwIOb4G2+8oXXr1mnWrFnq3r27JOnTTz9VMBjUxRdfbGWpSIA0uwtA4mVmZuree+/V/PnztX//fvXp00crVqzQb37zG82cOVOTJ0+2u0QAzbBjx44GG95t27ZJEg0x4ABffPGF7rvvPo0bN06rVq2KGvvJT36icDhsU2UAYql9lnfPnj0aMGBA1FhVVZUKCgrUs2dPzZw5M7L9gw8+0A9+8AMFAgFLa0Xr8QyxS02bNk3t2rVTUVGRNmzYoHvuuUdjx47VggUL7C4NQDOUlJTo2LFjGjx4cMzx7du3S6IhBpzg7bffVkVFhfLy8mKO+3w8HANSSf2G+ExPPfWUPvroI/3bv/2b2rRpE9nO64edi9/ALtW5c2dNnjxZq1at0pgxY/T3f//3eu655zglC3CIphrebdu2qU2bNurbt6+VZQGIQ8eOHSVJjz32mF5//XWVl5fbXBGAxmRnZ+uCCy44qyE+ceKE5s2bp1GjRunWW2+NGqMhdi4aYhcbP368qqqq1KFDB7322mucwgE4yI4dOySp0WeIBw0apLQ0XvkCpLrrr79et956qz744AP96Ec/UqdOnTRy5EgtX7680TftAWCfgQMHau/evVHb5s2bp9LSUi1evPis+9MQOxcNsUudPHlSd911lyTpm2++0XfffWdzRQBaYvv27ercubN69ux51tjx48f1+eefc7o04BB+v1+vvPKK9u7dq0ceeUTXXHONtmzZovz8fF1//fW8wzSQggYMGKBDhw5FHkMfOHBAy5Yt05QpU2K+cdann37Km9Y6FA2xC1VWVmrMmDH67LPPtHr1aoXDYS1cuNDusgC0wM6dOzVo0KCYY1u3bpUkXXHFFVaWBKCV+vXrp5kzZ2rdunU6fPiw+vfvrw0bNmj//v12lwbgDAMHDlQ4HNZHH30kSSooKFCnTp00b948ewtDwtEQu9Ddd9+tt99+W//xH/+hm266SXfccYeeeeYZHT161O7SADRDKBTSkSNHdO6558YcX716tfx+f4Nv0AMg9Z133nkaMmSIJPGaYiAF1X9jrTfeeENr167Vww8/rE6dOtlbGBKOhthl5syZo+eee05PPfWURo8eLUmaPXu2KioqtGjRIpurA9Acfr9f2dnZ2rlzpyorK6PGdu7cqZUrV2rcuHHKycmxqUIAzfXVV1/F3H7ixAkVFxera9euZ32sCwD79e3bV2lpadq1a5cKCgqUm5urSZMm2V0WksAweeGKazz99NO65557NGfOHP3mN7+JGhs/frzWrl2rP//5z/xlC3CA+fPna86cORo5cqQmTJigjIwMbdu2TcuWLVPPnj31zjvvKDs72+4yATRh1KhRKisr07hx49S/f3+FQiHt3btXS5cu1ddff63//u//1ogRI+wuE0AMF198sQ4dOqTy8nL9z//8T+SsDrgLDbFLrF27VjfeeKPGjx+v559//qzxPXv2aODAgZo3b55+/etf21AhgJb693//dz3+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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 4, figsize=(12, 3))  # 创建1行4列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制X的热力图\n",
    "ax.set_aspect(\"equal\")  # 设置子图的宽高比为相等\n",
    "plt.title(r'$X$')  # 设置标题为X\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(U, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制U的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$U$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(S, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制S的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$S$')\n",
    "\n",
    "plt.sca(axs[3])  # 设置当前子图为第四个子图\n",
    "ax = sns.heatmap(V.T, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制V^T的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$V^T$')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "10150a72-d876-434a-8016-42b395623b9d",
   "metadata": {},
   "source": [
    "## 压缩形式SVD分解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5f752c79-847f-4bf1-ab5a-7bcba6bf26b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import copy  # 导入copy模块，用于深度复制矩阵\n",
    "X_rank_3 = copy.deepcopy(X)  # 深度复制矩阵X\n",
    "X_rank_3[:, 3] = X[:, 0] + X[:, 1]  # 调整X的第4列，使其等于第1列与第2列之和，降秩至3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3b6f29c2-c764-4189-966a-ec4af79f97ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "U_rank_3, S_rank_3, V_rank_3 = svd(X_rank_3, full_matrices=False)  # 对压缩形式的X进行SVD分解"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d06d9219-148b-4f3b-ac25-4c62076e2f79",
   "metadata": {},
   "source": [
    "## 可视化压缩形式的SVD分解结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "cc386840-884f-44ca-84ea-43fc21af0fa9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$V^T$')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 4, figsize=(12, 3))  # 创建1行4列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X_rank_3, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制压缩后的X的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X$')\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(U_rank_3, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制U的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$U$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(S_rank_3, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制S的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$S$')\n",
    "\n",
    "plt.sca(axs[3])  # 设置当前子图为第四个子图\n",
    "ax = sns.heatmap(V_rank_3.T, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制V^T的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$V^T$')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b17b35c8-9c6d-4008-acfc-1cf94a12ec1a",
   "metadata": {},
   "source": [
    "## 截断形式的SVD分解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9bf8ea23-bf94-4718-b383-fec4fb8d1bf5",
   "metadata": {},
   "outputs": [],
   "source": [
    "num_p = 2  # 设置截断的奇异值数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "51928f37-f8d9-498e-9ff3-8ab0ed741eef",
   "metadata": {},
   "outputs": [],
   "source": [
    "U_truc = U[:, 0:num_p]  # 选取前num_p列的U矩阵\n",
    "S_truc = S[0:num_p, 0:num_p]  # 选取前num_p行和列的S矩阵\n",
    "V_truc = V[:, 0:num_p]  # 选取前num_p列的V矩阵\n",
    "\n",
    "X_hat = U_truc @ S_truc @ (V_truc.T)  # 计算重构的矩阵X_hat"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d38f12b-e7c7-4e9d-ade7-175dfea90c4d",
   "metadata": {},
   "source": [
    "## 可视化重构矩阵及其SVD分解结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "70364582-0475-428f-9c90-224920d50825",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$V^T$')"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 4, figsize=(12, 3))  # 创建1行4列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X_hat, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制重构矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}$')  # 设置标题为重构矩阵\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(U_truc, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制截断的U矩阵\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$U$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(S_truc, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制截断的S矩阵\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$S$')\n",
    "\n",
    "plt.sca(axs[3])  # 设置当前子图为第四个子图\n",
    "ax = sns.heatmap(V_truc.T, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制截断的V^T矩阵\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('$V^T$')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a877bc08-dfce-4b6d-9b12-ba04f7647cd8",
   "metadata": {},
   "source": [
    "## 可视化重构误差"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "70bffd76-9bab-4729-bf95-dc14b9df3e41",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$E_e = X - \\\\hat{X}$')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8QAAAEaCAYAAADXB56BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAlNklEQVR4nO3dfZRVBb038N+ZGTiiOOMlguSiRHqf8i3uBayFCb4lZj3mS77epZBYT5jaUp4yy7zcuregcuUbaqRF6lqm3ZX4kjcLr4ia5oOI+a6pGL4RiDokygAz+/kDRY5z5o05Z++Zsz+ftc5izj777N/v7MX6rv07e++ZQpIkSQAAAEDO1GXdAAAAAGTBQAwAAEAuGYgBAADIJQMxAAAAuWQgBgAAIJcMxAAAAOSSgRgAAIBcMhADAACQSwZiAAAAcslADAAAQC4ZiAGgj3j22Wdju+22i0mTJkWSJFm3AwA1z0AMAH1AkiQxbdq0OOuss2Lt2rUxZ86crFsCoAxfXtYWAzEA9AEXX3xxDBgwIL73ve/Fr3/965g9e3Y899xzWbcFwBZ8eVl7ComvNQAAALp00UUXxS233BJ/+MMfYtmyZTFp0qS4++674yMf+UjWrbGVDMQAAADkkkumAQAAyCUDMQBk5Ac/+EEUCoVYunRpu9emTJkSDQ0Nceutt2bQGQDkg4GYqnPAB1De6aefHjvssEP84Ac/KFn+b//2b3HNNdfEJZdcEp/73Ocy6g7Im//+7/+OQqHQ4ePnP/95Jn1lfSyZdX2qy0BM1TngAyivsbExzjjjjLjhhhviySefjIiIefPmxX/8x3/E2WefHaeeemrGHQJ58uCDD0ZExE033RT33Xdfu8cxxxyTSV9ZH0tmXZ8qSyAF5513XlJXV5c88cQTSZIkyS9+8YskIpKzzz47484AsrV69epk8ODByZQpU5IFCxYkAwYMSI499tikra0t69aAnDnyyCOTxsbGPpk/WR9LZl2f6vFbpknFa6+9FqNGjYqjjjoqTjrppPjsZz8bRx55ZFx33XVRKBSybg8gU2effXZccMEFse2228bHP/7xuP3226NYLGbdFpAzo0aNilGjRsVdd92VdSvtZH0smXV9qsdATGoc8AGUt3Tp0hg7dmyMGDEiHnnkkRgyZEjWLQE5s3r16hg6dGh89atfjYsuuqjd6/X19T0e/JIkidbW1m6t29DQ0OU6WR9LZl2f6nAPMak54YQTYuPGjTF48OC46aabBAhARKxZsyZOPvnkiIh49dVX46233sq4IyCP3r1/+LLLLosBAwa0ezz++OM93uaiRYvKbqvc4/nnn+9ye1kfS2Zdn+ro+qsYqIByB3zOgAB5t2HDhvjCF74Qzz33XNx4441x9NFHx49//OOyZ2cAqmnJkiUREXHDDTfETjvt1O713XffvcfbHDduXCxevLhb644YMaLT17fmWPLOO++MAw44oFv1ly5dGv/8z/9c0fr0Dy6Zpuo2bNgQn/3sZ+P++++Pa665Jo4++ugOL8cByJOpU6fGtddeG7/97W/jkEMOiZNPPjmuv/76eP7552PYsGFZtwfkyLHHHhu33HJLvPnmm1FfX9/hem1tbXHhhRfGT3/601i1alV8/vOfjyuuuCIGDhzYbt1KXTK9tceSr7zySrf/HNJRRx3V4YDrWLbGZff7vMiLKVOmJA0NDcltt92WJEmSfPGLX0wGDRqU/O1vf8u4M4DsnHvuuUlEJFdeeeXmZU8//XRSX1+fnHPOORl2BuTRLrvskowfP77L9c4999xk0qRJyYsvvpj8/e9/Tw488MBkzpw5ZddduHBhEhHdeixbtqzDmlkfS2Zdn+oyEFNVDvgA2ps7d24SEcl3vvOddq8df/zxSWNjY/L666+n3xiQS2+88UZSKBSSU045pdP1Xn755WTw4MHJSy+9tHnZFVdckZx88sll11+zZk2yePHibj1aWlrKbiPrY8ms61N9BmKqxgEfQHu33nprUl9fn5x44ollX3/kkUeSQqGQfPe73025MyCv7rjjjiQikq997WvJfffd1+6xfPnyJEmS5Oqrr04aGhqSpqamzY/BgwcnZ555ZlX6yvpYMuv6pMNATFU44AMA6B/OP//8Ti9nfvfs6IUXXph88YtfTKWnrI8ls65PevxSLQAAoEt33313HHfccfE///M/sdtuu8Xq1atj8eLF8ZnPfCbr1mCr+TvEAABAlyZOnBhnnXVWTJ48OQYPHhyf+MQn4uGHH866LegVZ4gBAADIJWeIAQAAyCUDMQAAALlkIAYAACCXDMQAAADkkoEYAACAXGrIugE6Nv9De6RX7PbbUyvVtE16/+3m/emvqdW65sTxqdWCvFty2MGp1fr6QeelVuvi48akVutvb65Prdan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",
      "text/plain": [
       "<Figure size 1200x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 3, figsize=(12, 3))  # 创建1行3列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制原始矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X$')\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(X_hat, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制重构矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(X - X_hat, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制重构误差矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$E_e = X - \\hat{X}$')  # 设置标题为误差矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5bb20b1-1e2c-4aab-b0a3-3c67d9ec2df2",
   "metadata": {},
   "source": [
    "## 计算奇异值的张量积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "eac61c89-2bcc-4492-865b-8a8bd3430c7b",
   "metadata": {},
   "outputs": [],
   "source": [
    "u1_outer_v1 = np.outer(U[:, 0][:, None], V[:, 0][:, None])  # 计算第1个奇异值的外积\n",
    "u2_outer_v2 = np.outer(U[:, 1][:, None], V[:, 1][:, None])  # 计算第2个奇异值的外积\n",
    "u3_outer_v3 = np.outer(U[:, 2][:, None], V[:, 2][:, None])  # 计算第3个奇异值的外积\n",
    "u4_outer_v4 = np.outer(U[:, 3][:, None], V[:, 3][:, None])  # 计算第4个奇异值的外积"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e85d69b9-b03e-4a2a-b782-4718b502ed40",
   "metadata": {},
   "source": [
    "## 可视化奇异值的张量积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "cb379efc-a865-4c5c-845e-b95bfd5d24f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$u_4 v_4^T$')"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8QAAAETCAYAAADwCM9JAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAArxElEQVR4nO3df3RU9Z3/8dedSWYIBIJAiVBEWKGigKkEPMVfbWnLlna1eqo97VFL63K2KLpfm7ZHRV30HN3QYhXWX6WlS3XPWuweirrd1W32FPEH4kIqBX+gYtHQYuSXJCYkk2Tmfv9IMsmQH8xk7v3cufc+H+fkMHPvcN+fq3nxue+5985Ytm3bAgAAAAAgZCJeDwAAAAAAAC/QEAMAAAAAQomGGAAAAAAQSjTEAAAAAIBQoiEGAAAAAIQSDTEAAAAAIJRoiAEAAAAAoURDDAAAAAAIJRpiAAAAAEAo0RADAAAAAEKJhhgZfvnLX6q0tFSlpaWKxWIqLi5OP1+wYIHXwwOQBXIMBANZBoKBLBc2y7Zt2+tBoDD9wz/8g0pLS3Xfffd5PRQAQ0SOgWAgy0AwkOXCwxliDGjXrl0655xzvB4GgDyQYyAYyDIQDGS58NAQo1+2beu1114jsICPkWMgGMgyEAxkuTDREKNf7777rhKJhGbOnOn1UAAMETkGgoEsA8FAlgsTDTH69ac//Umf+tSnFI/HvR4KgCEix0AwkGUgGMhyYaIh9oHx48fr+uuv77P8vPPO01e+8pWstvHVr35VZ5xxRp/ltm1r3rx5uuCCCzKWc38D4CxyDAQDWQaCgSyjGw1xgXv//fd16NAhzZkzJ2N5R0eHdu3a1Wf5QD796U9r3759ampqylj+2GOPqba2VmvWrMlYTmAB55BjIBjIMhAMZBm90RAXuB07dkiSKisrM5a/9tprSiQSWQe2oqJCtm3r9ddfTy9rbm7W8uXLtXjxYs2dOzfj9QQWcA45BoKBLAPBQJbRGw1xgduxY4disZhmzZqVsby2tlaS0oF95JFHNGfOHBUXF+vOO+/ss52KigpJ0u7du9PLVq5cqcbGRv3zP/9zn9e/++67+upXv+rUbgChlk2OE4mEvvvd7+q0007TqFGj9JnPfEZbt27NeD05BryV7Zz8zW9+U+Xl5Ro1apTOOecc/e53v8t4PVkGvJVtlru9/PLLikQiuvvuuzOWk+VgoCEucNu3b9fs2bNVXFycsby2tlZjxozRlClTJEkTJkzQXXfdpcsuu6zf7UyfPl3Dhw9PB3b//v366U9/quXLl2vChAnp152ssQaQu2xy3NHRoalTp+qll17SsWPHdN111+nSSy/V8ePH06/PJsfZNNYAhibbOfmOO+7Q/v371djYqHXr1umqq67SkSNH0q/Pdk4+WWMNYGiyzbIkpVIp3XTTTTrvvPP6bCfbLHcbqLGGt2iIC9yrr77a72UbNTU1Gcsvu+wyXXLJJSorK+t3O5FIRLNmzUoH9uabb9app56qqqqqjNedrLEGkLtscjxixAj90z/9kyZPnqxIJKLFixcrlUrpnXfeSb8+mxxn01gDGJps5+SZM2cqFotJkoqKitTW1qa//vWv6fXZzskna6wBDE22WZaktWvX6oILLtCMGTP6vD7bLEuDN9bwFg1xAWtra9PRo0f1yU9+MmP5xo0btXfv3qzvb+hWUVGh3bt3a9u2bdqwYYNWrVrV52PfT9ZYA8jNUHO8Z88etbS09Pn0ypPlOJvGGkDucs3yVVddpWHDhqmyslILFizQ7NmzM9ZnMyefrLEGkLtcsnzkyBGtWbNGK1asGHB72WRZGryxhrdoiAtYLBbT3/zN3+ipp57Su+++qwMHDujhhx/WD37wA0l97284mYqKCh0+fFjXXnutLr74Yn396193Y9gAehlKjo8fP65rrrlGt99+u0pLSzPW5ZrjgRprALnJNcv//u//rqamJv3P//yPFi5cKMuyMtZnm+WTNdYAcpNLlm+99VZVVVUNeqIomyxn01jDOzTEBe7RRx9VMpnUzJkzdcEFF+i9997TrbfeKmloDbEkvfXWW1q9erXTQwUwgFxy3N7erm984xs6++yztXz58j7byiXHgzXWAHKX65xcVFSkhQsXqqamRv/93/+dsS7bLJ+ssQaQu2yyXFtbqz/+8Y9asmTJoNvKJsvZNNbwjmXbtu31IOCcJUuWaNKkSXl/IJZT2wGQvVQqpauuukrHjx/Xxo0bVVRUNORttbe36/LLL9fYsWP1q1/9ioNowEOLFi3SokWL9I//+I95befv/u7vdP311+srX/mKQyMDMJDVq1dr+fLlGj58uCSpqalJ0WhUX//61/XYY49lvZ3a2lp973vf0//93/8pEonoO9/5jqZNm6bbb7/draEj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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 4, figsize=(12, 3))  # 创建1行4列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(u1_outer_v1, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制u1与v1的外积\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$u_1 v_1^T$')  # 设置标题\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(u2_outer_v2, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制u2与v2的外积\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$u_2 v_2^T$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(u3_outer_v3, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制u3与v3的外积\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$u_3 v_3^T$')\n",
    "\n",
    "plt.sca(axs[3])  # 设置当前子图为第四个子图\n",
    "ax = sns.heatmap(u4_outer_v4, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制u4与v4的外积\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$u_4 v_4^T$')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "453c1692-98ce-40e2-a0a0-7dd053d200f0",
   "metadata": {},
   "source": [
    "## 可视化各部分重构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1c7806d8-cd7d-4472-a528-6aa82c982a68",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_1 = S[0, 0] * u1_outer_v1  # 第1个重构分量\n",
    "X_2 = S[1, 1] * u2_outer_v2  # 第2个重构分量\n",
    "X_3 = S[2, 2] * u3_outer_v3  # 第3个重构分量\n",
    "X_4 = S[3, 3] * u4_outer_v4  # 第4个重构分量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "f2437869-2c55-4fbb-b395-9e9abb3bbfad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$\\\\hat{X}_4$')"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 4, figsize=(12, 3))  # 创建1行4列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X_1, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制第1个重构分量\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_1$')  # 设置标题\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(X_2, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制第2个重构分量\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_2$')\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(X_3, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制第3个重构分量\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_3$')\n",
    "\n",
    "plt.sca(axs[3])  # 设置当前子图为第四个子图\n",
    "ax = sns.heatmap(X_4, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制第4个重构分量\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_4$')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb510464-dc17-4e2e-851b-4e3ee813a84b",
   "metadata": {},
   "source": [
    "## 重构与误差可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "b81ec182-3e74-4fdc-af95-abb6a998476c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$X - (\\\\hat{X}_1 + \\\\hat{X}_2)$')"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 3, figsize=(12, 3))  # 创建1行3列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制原始矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X$')  # 设置标题为原始矩阵\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(X_1 + X_2, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制前两个重构分量的和\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_1 + \\hat{X}_2$')  # 设置标题\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(X - (X_1 + X_2), cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制重构误差矩阵\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X - (\\hat{X}_1 + \\hat{X}_2)$')  # 设置标题为误差矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80d3300d-805a-434b-afd3-2756541a9a15",
   "metadata": {},
   "source": [
    "## 重新创建图表，绘制更多重构与误差"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "b93d6ec9-21f8-4609-8511-1d52d457069f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$X - (\\\\hat{X}_1 + \\\\hat{X}_2 + \\\\hat{X}_3)$')"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 3, figsize=(12, 3))  # 创建1行3列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制原始矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X$')  # 设置标题为原始矩阵\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(X_1 + X_2 + X_3, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制前3个重构分量的和\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_1 + \\hat{X}_2 + \\hat{X}_3$')  # 设置标题\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(X - (X_1 + X_2 + X_3), cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制重构误差矩阵\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X - (\\hat{X}_1 + \\hat{X}_2 + \\hat{X}_3)$')  # 设置标题为误差矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94f548c4-f61f-4039-a232-4a4494450437",
   "metadata": {},
   "source": [
    "## 整体重构与误差分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "081f97b3-6b58-4af8-b75a-95055c65fe93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABLMAAAElCAYAAAAfhaCbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsaUlEQVR4nO3dfbiUdZ0/8M/wNAdBjivEk4+ULj7mJfiEgqYmam5pV1ZaIabrJmvtKpumSKFtu1i2mr9MpTJWdyu9WsVsWSlcETOQVcJ8RE0J1CTUFBXhAOd8f38oJ0YOZziHmXvmPrxe1zWXZ+655/6+zy3MGz5n5qaQUkoBAAAAADnQrdYBAAAAAGBLGWYBAAAAkBuGWQAAAADkhmEWAAAAALlhmAUAAABAbhhmAQAAAJAbhlkAAAAA5IZhFgAAAAC5YZgFAAAAQG4YZgEAAACQG4ZZAAAAAOSGYRYAkIlnn302+vTpE0ceeWSklGodZxPybZ16zwdsG+r9tUi+rVPv+ciOYRYAUHUppTjrrLPiggsuiFWrVsW1115b60gl5Ns69Z4P2DbU+2uRfFun3vORrUIyzgQAquyaa66JX/ziF/GrX/0qlixZEkceeWT8+te/jve///21jhYR8m2tes8HbBvq/bVIvq1T7/nIlmEWAAAAALnhY4YAAAAA5IZhFgAAAAC5YZgFHfSv//qvUSgUYtGiRZs8dsYZZ0SPHj1i5syZNUgGUF/q/fVSvq1T7/mAyqqH3/Nf//rXY5999omWlpa6y9aees5Xz9kiKpvvxhtvjJ122ilWrVpV6ZjUQgI6ZOXKlWmHHXZIp556asn2r371qyki0nXXXVejZAD1pd5fL+XbOvWeD6isWv+ef/HFF1OfPn3Sz372s7rLVk4956vnbClVNt+6devSnnvumb72ta9VOiY1YJgFnfDVr341devWLT355JMppZR+9KMfpYhIF110UY2TAdSXrF4vjzrqqDR+/Hj5umg+oD7U8vf8RRddlHbaaafU3Nxcs2ydfa2s93zbUtd8+9vfTo2NjWnVqlUdfi71xTALOuHVV19Nffv2TWeccUaaPXt26tmzZ/rUpz6VWlpaah0NoK5k9XrZ2T8gy5ePfEB9qNXv+aamptS/f/904YUX1jTb1gyz6jnfttQ1L730UioUCunGG2/s8HOpL66ZBZ2w4447xoQJE+InP/lJfOITn4hDDz00br755igUCrWOBlBX6v31Ur6tU+/5gMqq1e/5BQsWxKuvvhpHH3103WXbUvWcr56zRVQ23+DBg2OvvfZyTccuwDALOun000+P9evXR9++fePnP/95FIvFWkcCqEtb8np5/fXXx4gRI6Jnz55x2WWXtXu8lFKsX7++5Jbeebf5Jtsrka+pqSk+//nPxy677BL9+vWLww47LObNm1c3+SIiTjvttBg0aFD069cvPvjBD8Z///d/11W+DebPnx/dunWLb3zjG1t0bKD+1OLPwPPnz4+IiBEjRmxVtlp2Tbl8umbr821QrmtGjBgRv/nNb7ZoXepY1m8Fg65g5cqV6YADDkgRkXr16pWef/75WkcCqEtb+no5Y8aMdOedd6ZTTz01TZkypd1jzpkzJ0XEFt2WLFmy1fneeuutdPnll6elS5em5ubm9O///u+pf//+m73eRtb5UkrpscceS01NTSmllBYsWJD69euXXnnllbrJl1JKzc3N6ZBDDkmHHnpo+ud//ud2jwvUp878GbgjrzmLFi1q8xj/+I//mAqFQlq/fv1WZatV12xJPl2z9flS2rKuueCCC1KhUEjr1q1rd13qW4+Oj79g27Zu3br4xCc+Ec8991zccccdceqpp8aVV14Z11xzTa2jAdSVjrxennLKKRER8fOf/7zscUeOHBkPPvhgybYvfOELMXTo0JgyZUrJ9qFDh251vj59+sTXvva11vvjx4+PCy64IJ555pk44IADap4vImLfffdt/bpHjx6xdu3aePHFF6N///51kS8iYtq0aXHEEUfEn//8580eE6hfnf0z8PDhw+MHP/jBFq2x6667trl99erV0bNnz+jevftWZatF12xpPl2z9fkitqxrGhoaIqUUa9asib59+252P+pcradpkDdnnHFG6tGjR5o1a1ZKKaUzzzwz9e7dO/3pT3+qcTKA+tKZ18uzzz677E/L29KZi8p29vX8ySefTA0NDenNN9+sq3yf+cxnUrFYTBGRPvKRj3TowrjVzvfKK6+k4cOHp9dffz2NHz/eO7Mgh2r5Z+BJkyaliEhvvfVWRbJl2TWdyZeSrulMvi3tmi984QupWCx2KAf1xzWzoAMmT54cN998c9xwww1x/PHHR0TEpEmTYu3atXH11VfXOB1A/aj318vO5nv77bdj3LhxMXny5Kr+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pyFDhqQ33nijWlFLLF26NC1atChdfvnlqW/fvmnRokVp0aJF6c0332wz85tvvpn+6Z/+Kc2bNy8tWbIkzZkzJ40aNSrttNNOmWXuTO6Uan+uTzjhhPTBD34wzZ8/P82fPz/tv//+6W/+5m9K9qn1ub7llltSz54904033pieeOKJdP7556c+ffqkP/zhDymllC6++OI0bty41v2fe+65tN1226ULLrggPfHEE+nGG29MPXv2TP/1X/9VlXyVyn311VenGTNmpKeffjo99thj6eKLL04RkW677bbMMr/55putv24jIl111VVp0aJFaenSpW1mrpdz3dHc9XCuJ0yYkBobG9O9995b8tr89ttvt+6T1fnWFbqiHF1RPboiO7qi8+c7rz2Rkq7QFaV0ha6odO56ONe17IqqDbOmT5+eIqLNW0mAiDR9+vTW+y0tLWnKlClp8ODBqVgspiOPPDI9+uij1Yq5ifHjx7eZec6cOW1mfvvtt9PYsWPT+973vtSzZ8+06667pvHjx6dly5ZllrkzuVOq/bl+9dVX02c/+9m0/fbbp+233z599rOf3eSfFa2Hc/29730v7bbbbqlXr15pxIgRJf/M6Pjx49NRRx1Vsv+9996bDjzwwNSrV6+0++67p+uvv76q+TanI7m/+c1vpg984AOpoaEh/dVf/VUaPXp0mjlzZqZ5N/zTsu+9jR8/vs3MKdXHue5o7no415t7bd749SGr860rdEU5uqK6dEV95q6Hc10vXZHXnkhJV+iKTemKbOiK7NSyKwrvBgAAAACAutfhf80QAAAAAGrFMAsAAACA3DDMAgAAACA3DLMAAAAAyA3DLAAAAABywzALAAAAgNwwzAIAAAAgNwyzAAAAAMgNwywAAAAAcsMwCwAAAIDcMMwCAAAAIDcMswAAAADIjf8PiAf6hDsL+v4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x300 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 3, figsize=(12, 3))  # 创建1行3列的子图\n",
    "\n",
    "plt.sca(axs[0])  # 设置当前子图为第一个子图\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制原始矩阵的热力图\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X$')  # 设置标题为原始矩阵\n",
    "\n",
    "plt.sca(axs[1])  # 设置当前子图为第二个子图\n",
    "ax = sns.heatmap(X_1 + X_2 + X_3 + X_4, cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制前4个重构分量的和\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$\\hat{X}_1 + \\hat{X}_2 + \\hat{X}_3 + \\hat{X}_4$')  # 设置标题\n",
    "\n",
    "plt.sca(axs[2])  # 设置当前子图为第三个子图\n",
    "ax = sns.heatmap(X - (X_1 + X_2 + X_3 + X_4), cmap='RdBu_r', vmax=all_max, vmin=all_min, cbar_kws={\"orientation\": \"horizontal\"})  # 绘制重构误差矩阵\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title(r'$X - (\\hat{X}_1 + \\hat{X}_2 + \\hat{X}_3 + \\hat{X}_4)$')  # 设置标题为误差矩阵\n",
    "\n",
    "# 结束代码\n",
    "plt.tight_layout()  # 调整子图间距\n",
    "plt.show()  # 显示所有图形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9943bc5d-19b9-4244-944e-b6a6d306d763",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
